//
// Created by Ac on 2021/10/26.
//

#include <reg51.h>

void delay1ms();

/**
 * 显示LED灯
 */
void led_display(void);

/**
 * LED灯对应显示字符
 */
unsigned char LED[] = {0x3f, 0x06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0x07, 0x7f, 0x6f};
/**
 * LED对应的位域 例 0111 1111 表示最后一盏灯亮,其他灭 0111 0111 表示第4盏和第8盏亮其他灭
 *
 * 0111 1111 0x7f 个位
 * 1011 1111 0xbf 十位
 */
unsigned char COM[] = {0x7f, 0xbf};
/**
 * 毫秒计数
 */
unsigned int millisecond = 0;
/**
 * 秒计数
 */
unsigned int second = 0;
/**
 * 设定要到达的秒数
 */
unsigned int setup = 60;

void main(void) {
    while (1) {
        // 计时
        delay1ms();
        // LED灯显示
        led_display();
    }
}

void led_display(void) {
    int cycle = millisecond % 2;    // 计算周期
    int sw = second / 10;           // 十位 例 59 / 10 = 5 小数溢出无效
    int gw = second % 10;           // 个位 例 59 % 10 = 9
    if (cycle == 0) {
        P1 = LED[gw];               // 显示个位
    } else {
        P1 = LED[sw];               // 显示十位
    }
    P2 = COM[cycle];                // 对应位域
}

void delay1ms() {
    unsigned int i;
    TMOD = 0X16;
    TH1 = 0xfc;
    TL1 = 0x18;
    TR1 = 1;
    while (!TF1); // 等带中断溢出
    millisecond++;                        // 每次加1毫秒
    if (millisecond == 1000) {            // 1000毫秒 = 1秒
        second++;                         // 加1秒
        millisecond = 0;                  // 毫秒计数器归0
        if (second == setup) second = 0;  // 秒数归0
    }
    P1 = 0x00;         // 清除数字，防止显示错误
    TF1 = 0;
}